<?php

namespace Sisesporte\Service;

use Doctrine\ORM\EntityManager;
use Sisesporte\Entity\Pessoa,
    Sisesporte\Entity\Professor,
    Sisesporte\Entity\AdmissaoProfessor,
    Sisesporte\Entity\ModalidadeProfessor,
    Sisesporte\Entity\Endereco,
    Sisesporte\Entity\Telefone,
    Sisesporte\Entity\Contato;
use Sisesporte\Utils\Utils;

class ProfessorService extends AbstractService {

    public function __construct(EntityManager $em) {
        parent::__construct($em);
        $this->entity = "Sisesporte\Entity\Professor";
        date_default_timezone_set('America/Sao_Paulo');
    }

    public function insert(array $data) {
        $utils = new Utils();

        //Inserir Pessoa
        $sqUfOrgExpedidor = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfOrgExpedidor']);
        $sqOrgaoExpIdentidade = $this->em->getReference('Sisesporte\Entity\OrgaoExpedidor', $data['sqOrgaoExpIdentidade']);
        $sqGrauEscolaridade = $this->em->getReference('Sisesporte\Entity\GrauEscolaridade', $data['sqGrauEscolaridade']);
        $sqEstadoCivil = $this->em->getReference('Sisesporte\Entity\EstadoCivil', $data['sqEstadoCivil']);
        $sqPais = $this->em->getReference('Sisesporte\Entity\Pais', '1');
        $sqUfNaturalidade = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfDadosPessoais']);
        $sqCidadeNaturalidade = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidadeDadosPessoais']);

        $dataCadastro = (string) date("d/m/Y");
        $entityPessoa = new Pessoa();
        $entityPessoa->setSqCidadeNaturalidade($sqCidadeNaturalidade)
                ->setSqUfNaturalidade($sqUfNaturalidade)
                ->setDtCadastro($dataCadastro)
                ->setNoPessoa($data['noPessoa'])
//                ->setTxCaminhoFoto('$data['txCaminhoFoto']')
                ->setDtNascimento($data['dtNascimento'])
                ->setNuCpf($utils->formatarCpfCnpj($data['nuCpf'], FALSE))
                ->setNuIdentidade($data['nuIdentidade'])
                ->setSqUfOrgExpedidor($sqUfOrgExpedidor)
                ->setSqOrgaoExpIdentidade($sqOrgaoExpIdentidade)
                ->setDtExpedicao($data['dtExpedicao'])
                ->setInSexo($data['inSexo'])
                ->setNoMae($data['noMae'])
                ->setNoPai($data['noPai'])
                ->setNuFilho((int) $data['nuFilho'])
                ->setInTipoPessoa("P")
                ->setNoEmail($data['noEmail'])
                ->setSqGrauEscolaridade($sqGrauEscolaridade)
                ->setSqEstadoCivil($sqEstadoCivil)
                ->setSqNacionalidade($sqPais)
                ->setStAtivo('TRUE');
        $this->em->persist($entityPessoa);
        $this->em->flush();

        // Inserir Telefone Fixo

        $sqTipoTelefoneFixo = $this->em->getReference('Sisesporte\Entity\TipoTelefone', '1');
        $sqTipoTelefoneMovel = $this->em->getReference('Sisesporte\Entity\TipoTelefone', '4');



        $entityTelefoneFixo = new Telefone();
        $entityTelefoneFixo->setSqPessoa($entityPessoa);
        $entityTelefoneFixo->setNoTelefone($utils->retiraMaskTel($data['noTelefoneFixo']))
                ->setSqTipoTelefone($sqTipoTelefoneFixo);
        $entityTelefoneFixo->setStAtivo(TRUE);
        $this->em->persist($entityTelefoneFixo);
        $this->em->flush();


        $entityTelefone = new Telefone();
        $entityTelefone->setSqPessoa($entityPessoa);
        $entityTelefone->setNoTelefone($utils->retiraMaskTel($data['noTelefoneMovel']))
                ->setSqTipoTelefone($sqTipoTelefoneMovel);
        $entityTelefone->setStAtivo(TRUE);
        $this->em->persist($entityTelefone);
        $this->em->flush();

        // Inserir Contato
        $sqParentesco = $this->em->getReference('Sisesporte\Entity\Parentesco', '11');

        $entityContato = new Contato();
        $entityContato->setSqPessoa($entityPessoa)
                ->setNoContato($data['noContato'])
                ->setNoTelefone($utils->retiraMaskTel($data['noTelefone']))
                ->setStTipoContato('E')
                ->setSqParentesco($sqParentesco)
                ->setStAtivo(TRUE);
        $this->em->persist($entityContato);
        $this->em->flush();

        // Inserir Endereço
        $sqContato = $this->em->getReference('Sisesporte\Entity\Contato', $entityContato->getSqContato());
        $sqCidade = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidade']);

        $entityEndereco = new Endereco();
        $entityEndereco->setSqPessoa($entityPessoa)
                ->setStAtivo(TRUE)
                ->setSqContato($sqContato)
                ->setSqCidade($sqCidade)
                ->setNuCep($data['nuCep'])
                ->setNoEndereco($data['noEndereco'])
                ->setNoComplemento($data['noComplemento'])
                ->setNoBairro($data['noBairro']);
        $this->em->persist($entityEndereco);
        $this->em->flush();

        // Inserir Professor
        $sqUfCref = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfCref']);
        $dtCadastro = (string) date('d/m/Y');

        $entityProfessor = new Professor();
        $entityProfessor->setSqPessoa($entityPessoa)
                ->setDeEspecialidade($data['deEspecialidade'])
                ->setCoMatricula($data['coMatricula'])
                ->setNoLotacao($data['noLotacao'])
                ->setNoCref($data['noCref'])
                ->setSqUfCref($sqUfCref)
                ->setNoApelido('')
                ->setDtExpedicaoCref($data['dtExpedicaoCref'])
                ->setDtValidadeCref($data['dtValidadeCref'])
                ->setDeCategoriaCref($data['deCategoriaCref'])
                ->setDeAtuacaoCref($data['deAtuacaoCref'])
                ->setDtCadastro($dtCadastro)
                ->setDtAtualizacao($dtCadastro)
                ->setStAtivo(TRUE);
        $this->em->persist($entityProfessor);
        $this->em->flush();

        // Admissão Professor
        $entityAdmissao = new AdmissaoProfessor();
        $entityAdmissao
                ->setSqProfessor($entityProfessor)
                ->setTxObservacao($data['txObservacao'])
                ->setStAtivo(TRUE)
                ->setNuCargaHoraria($data['nuCargaHoraria'])
                ->setNoOrgaoAdmissao($data['noOrgaoAdmissao'])
                ->setDtInicioAdmissao($data['dtInicioSesp'])
                ->setDtAdmissaoOrgao($data['dtInicioAdmissao']);
//                ->setDtFinalAdmissao($data['dtFinalAdmissao'])
        $entityAdmissao->setCoOrgaoAdmissao($data['coOrgaoAdmissao']);
        $this->em->persist($entityAdmissao);
        $this->em->flush();

        // Inserir Modalidade Professor
        if (count($data['sqModalidade']) > 0) {
            foreach ($data['sqModalidade'] as $value) {
                $sqModalidade = $this->em->getReference('Sisesporte\Entity\Modalidade', $value);

                $entityModalidadeProfessor = new ModalidadeProfessor();
                $entityModalidadeProfessor->setSqPessoa($entityProfessor)
                        ->setStAtivo(TRUE)
                        ->setSqModalidade($sqModalidade);
                $this->em->persist($entityModalidadeProfessor);
                $this->em->flush();
            }
        }

        if (strlen($entityPessoa->getSqPessoa()) < 5) {
            $qtd = 5 - strlen($entityPessoa->getSqPessoa());
            $sq = $entityPessoa->getSqPessoa();
            for ($i = 0; $i < $qtd; $i++) {
                $sq = "0" . $sq;
            }
        } else {
            $sq = $entityPessoa->getSqPessoa();
        }

        $nome_foto = date('Y') . "_" . $sq;
        rename($_SERVER['DOCUMENT_ROOT'] . "/upload/foto/" . $data['noImagem']['name'], $_SERVER['DOCUMENT_ROOT'] . "/upload/foto/" . $nome_foto . ".jpg");

        $repoP = $this->em->getRepository("Sisesporte\Entity\Pessoa")->find($entityPessoa->getSqPessoa());
        $repoP->setTxCaminhoFoto("upload/foto/" . $nome_foto . ".jpg");
        $this->em->persist($repoP);
        $this->em->flush();



        return $entityPessoa->getSqPessoa();
    }

    public function update($id, array $data) {
        $utils = new \Sisesporte\Utils\Utils();


        $sqUfOrgExpedidor = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfOrgExpedidor']);
        $sqOrgaoExpIdentidade = $this->em->getReference('Sisesporte\Entity\OrgaoExpedidor', $data['sqOrgaoExpIdentidade']);
        $sqGrauEscolaridade = $this->em->getReference('Sisesporte\Entity\GrauEscolaridade', $data['sqGrauEscolaridade']);
        $sqEstadoCivil = $this->em->getReference('Sisesporte\Entity\EstadoCivil', $data['sqEstadoCivil']);
        $sqPais = $this->em->getReference('Sisesporte\Entity\Pais', '1');
        $sqUfNaturalidade = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfDadosPessoais']);
        $sqCidadeNaturalidade = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidadeDadosPessoais']);
        $dataCadastro = (string) date("d/m/Y");

        $repoP = $this->em->getRepository("Sisesporte\Entity\Pessoa")->find($id);
        $objPessoa = $repoP;

        $objPessoa->setSqCidadeNaturalidade($sqCidadeNaturalidade)
                ->setSqUfNaturalidade($sqUfNaturalidade)
                ->setDtCadastro($dataCadastro)
                ->setNoPessoa($data['noPessoa'])
//                ->setTxCaminhoFoto('$data['txCaminhoFoto']')
                ->setDtNascimento($data['dtNascimento'])
                ->setNuCpf($utils->formatarCpfCnpj($data['nuCpf'], FALSE))
                ->setNuIdentidade($data['nuIdentidade'])
                ->setSqUfOrgExpedidor($sqUfOrgExpedidor)
                ->setSqOrgaoExpIdentidade($sqOrgaoExpIdentidade)
                ->setDtExpedicao($data['dtExpedicao'])
                ->setInSexo($data['inSexo'])
                ->setNoMae($data['noMae'])
                ->setNoPai($data['noPai'])
                ->setNuFilho((int) $data['nuFilho'])
                ->setInTipoPessoa("P")
                ->setNoEmail($data['noEmail'])
                ->setSqGrauEscolaridade($sqGrauEscolaridade)
                ->setSqEstadoCivil($sqEstadoCivil)
                ->setSqNacionalidade($sqPais);
        $this->em->persist($objPessoa);
        $this->em->flush();

        $sqTipoTelefoneFixo = $this->em->getReference('Sisesporte\Entity\TipoTelefone', '1');
        $sqTipoTelefoneMovel = $this->em->getReference('Sisesporte\Entity\TipoTelefone', '4');

        $repoTF = $this->em->getRepository("Sisesporte\Entity\Telefone")->findBy(array(
            'sqPessoa' => $id,
            'sqTipoTelefone' => $sqTipoTelefoneFixo
                ));
        $objTelefoneFixo = $repoTF;

        $objTelefoneFixo[0]->setSqPessoa($objPessoa);
        $objTelefoneFixo[0]->setNoTelefone($utils->retiraMaskTel($data['noTelefoneFixo']));
        $this->em->persist($objTelefoneFixo[0]);
        $this->em->flush();

        $repoTM = $this->em->getRepository("Sisesporte\Entity\Telefone")->findBy(array(
            'sqPessoa' => $id,
            'sqTipoTelefone' => $sqTipoTelefoneMovel
                ));
        $objTelefone = $repoTM;

        $objTelefone[0]->setSqPessoa($objPessoa);
        $objTelefone[0]->setNoTelefone($utils->retiraMaskTel($data['noTelefoneMovel']));
        $this->em->persist($objTelefone[0]);
        $this->em->flush();

        $sqParentesco = $this->em->getReference('Sisesporte\Entity\Parentesco', '11');

        $repoC = $this->em->getRepository("Sisesporte\Entity\Contato")->findBy(array(
            'sqPessoa' => $id,
            'sqParentesco' => $sqParentesco
                ));
        $objContato = $repoC;

        $objContato[0]->setSqPessoa($objPessoa)
                ->setNoContato($data['noContato'])
                ->setNoTelefone($utils->retiraMaskTel($data['noTelefone']));
        $this->em->persist($objContato[0]);
        $this->em->flush();

        $sqCidade = $this->em->getReference('Sisesporte\Entity\Cidade', $data['sqCidade']);

        $repoE = $this->em->getRepository("Sisesporte\Entity\Endereco")->findBy(array(
            'sqPessoa' => $id
                ));
        $objEndereco = $repoE;

        $objEndereco[0]->setSqPessoa($objPessoa)
                ->setStAtivo(TRUE)
                ->setSqCidade($sqCidade)
                ->setNuCep($data['nuCep'])
                ->setNoEndereco($data['noEndereco'])
                ->setNoComplemento($data['noComplemento'])
                ->setNoBairro($data['noBairro']);
        $this->em->persist($objEndereco[0]);
        $this->em->flush();

        $sqUfCref = $this->em->getReference('Sisesporte\Entity\Uf', $data['sqUfCref']);
        $dtCadastro = (string) date('d/m/Y');

        $repoPr = $this->em->getRepository("Sisesporte\Entity\Professor")->findBy(array(
            'sqPessoa' => $id
                ));
        $objProfessor = $repoPr;


        $objProfessor[0]->setSqPessoa($objPessoa)
                ->setDeEspecialidade($data['deEspecialidade'])
                ->setCoMatricula($data['coMatricula'])
                ->setNoCref($data['noCref'])
                ->setSqUfCref($sqUfCref)
                ->setDtExpedicaoCref($data['dtExpedicaoCref'])
                ->setDtValidadeCref($data['dtValidadeCref'])
                ->setDeCategoriaCref($data['deCategoriaCref'])
                ->setDeAtuacaoCref($data['deAtuacaoCref'])
                ->setDtCadastro($dtCadastro)
                ->setDtAtualizacao($dtCadastro);
        $this->em->persist($objProfessor[0]);
        $this->em->flush();

        $repoAP = $this->em->getRepository("Sisesporte\Entity\AdmissaoProfessor")->findBy(array(
            'sqProfessor' => $id
                ));
        $objAdmissaoProfessor = $repoAP;

        $objAdmissaoProfessor[0]
                ->setTxObservacao($data['txObservacao'])
                ->setNuCargaHoraria($data['nuCargaHoraria'])
//                ->setNoOrgaoAdmissao($data['noOrgaoAdmissao'])
                ->setDtInicioAdmissao($data['dtInicioSesp'])
                ->setDtFinalAdmissao($data['dtFinalAdmissao'])
                ->setCoOrgaoAdmissao($data['coOrgaoAdmissao']);
        $objAdmissaoProfessor[0]->setDtAdmissaoOrgao($data['dtInicioAdmissao']);
        $objAdmissaoProfessor[0]->setInLotacao($data['noLotacao']);
        $this->em->persist($objAdmissaoProfessor[0]);
        $this->em->flush();

        $repoMP = $this->em->getRepository("Sisesporte\Entity\ModalidadeProfessor")->findBy(array(
            'sqPessoa' => $id
                ));
        $objModalidadeProfessor = $repoMP;

        $i = 0;
        foreach ($objModalidadeProfessor as $modalidade) {
            $modalidades[$i] = $modalidade->getSqModalidadeProfessor();
            $entity = $this->em->getReference("Sisesporte\Entity\ModalidadeProfessor", $modalidade->getSqModalidadeProfessor());
            if ($entity) {
                $this->em->remove($entity);
                $this->em->flush();
            }
            $i++;
        }

        if (count($data['sqModalidade']) > 0) {
            foreach ($data['sqModalidade'] as $value) {
                $sqModalidade = $this->em->getReference('Sisesporte\Entity\Modalidade', $value);

                $entityModalidadeProfessor = new ModalidadeProfessor();
                $entityModalidadeProfessor->setSqPessoa($objProfessor[0])
                        ->setStAtivo(TRUE)
                        ->setSqModalidade($sqModalidade);
                $this->em->persist($entityModalidadeProfessor);
                $this->em->flush();
            }
        }


//        $entity = $this->em->getReference("Sisesporte\Entity\ModalidadeProfessor", $modalidade->getSqModalidadeProfessor());
//        if ($entity) {
//            $this->em->remove($entity);
//            $this->em->flush();
//        }
    }
    
    
    public function findProfessorByCPF($noCref)
    {
        $params = array('noCref' => $noCref);
        $entity = $this->em->getRepository("Sisesporte\Entity\Professor")->findBy($params);
        
        return $entity;
    }
    
    
    

}
